﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using System.Data.SqlClient;
using QLCONGNOLIBS.Models;
using QLCONGNOLIBS.Securities;
using QLCONGNOLIBS.Controllers;
using QLCONGNOLIBS.Ultils;
using System.Threading;
using QLCONGNOLIBS.Models.EntityFW;

namespace QLCONGNOAPPs.UserForms.Customers
{
    public partial class frmCustomerDetails : DevExpress.XtraEditors.XtraForm
    {
        private SqlConnection m_objConnection;
        private SecurityEntity m_objSecurity;
        private EmployeeControllers m_objEmpController;
        private CustomerControllers m_objCusController;
        private CityControllers m_objCityController;
        private ICustomer m_objCustomer;
        private bool isFlag;
        double counterTick = 0.06;
        
        public frmCustomerDetails(ICustomer objCustomer,
                                SqlConnection objConnection, SecurityEntity objSecurity, bool isAction)
        {
            InitializeComponent();
            ucpdateDetails1.PressdUpdate += new EventHandler(ucpdateDetails1_PressdUpdate);
            ucpdateDetails1.PressdCancel += new EventHandler(ucpdateDetails1_PressdCancel);
            m_objCustomer = objCustomer;
            m_objConnection = objConnection;
            m_objSecurity = objSecurity;
            m_objEmpController = new EmployeeControllers(m_objConnection, m_objSecurity);
            m_objCusController = new CustomerControllers(m_objConnection, m_objSecurity);
            m_objCityController = new CityControllers(m_objConnection, m_objSecurity);            
            //Load dữ liệu nhân viên
            LoadDataOfEmployee();
            //Load dữ liệu thành phố
            LoadDataOfCity();
            //Bindding dữ liệu lên forms với trường hợp là cập nhật
            isFlag = isAction;
            if(objCustomer != null)
                BinddingDataOfControls(objCustomer);            
            else             
                txtMaKH.Text = ""+Guid.NewGuid();          
        }

        void ucpdateDetails1_PressdCancel(object sender, EventArgs e)
        {
            this.Close();
        }

        void ucpdateDetails1_PressdUpdate(object sender, EventArgs e)
        {
            dxErrorProvider1.ClearErrors();
              try
            {
                this.Cursor = Cursors.WaitCursor;
                 //1. Kiểm tra các điều khiển trên forms
                 if(!Validations.IsFilled(txtTenDayDu.Text)){
                     dxErrorProvider1.SetError(txtTenDayDu, "Bạn cần nhập vào Tên đầy đủ!");
                     txtTenDayDu.Focus();
                 }
                 else if(!Validations.isValidOfFullName(txtTenDayDu.Text)){
                     dxErrorProvider1.SetError(txtTenDayDu, "Tên đầy đủ bạn nhập vào không hợp lệ!");
                     txtTenDayDu.Focus();
                 }
                 else if (!Validations.IsFilled(txtTenCongTy.Text))
                 {
                     dxErrorProvider1.SetError(txtTenCongTy, "Bạn cần nhập vào Tên Công Ty!");
                     txtTenCongTy.Focus();
                 }
                 else if (!Validations.IsFilled(txtDiaChi.Text))
                 {
                     dxErrorProvider1.SetError(txtDiaChi, "Bạn cần nhập vào Địa Chỉ!");
                     txtDiaChi.Focus();
                 }
                 else if (!Validations.IsFilled(txtDienThoai.Text))
                 {
                     dxErrorProvider1.SetError(txtDienThoai, "Bạn cần nhập vào Số Điện Thoại!");
                     txtDienThoai.Focus();
                 }
                 else if (!Validations.CheckIsInteger(txtDienThoai.Text))
                 {
                     dxErrorProvider1.SetError(txtDienThoai, "Số điện thoại bạn nhập vào không hợp lệ!");
                     txtDienThoai.Focus();
                 }
                 else if (!Validations.IsFilled(txtEmail.Text))
                 {
                     dxErrorProvider1.SetError(txtEmail, "Bạn cần nhập vào Email!");
                     txtEmail.Focus();
                 }
                 else if (!Validations.CheckEmail(txtEmail.Text))
                 {
                     dxErrorProvider1.SetError(txtEmail, "Email bạn nhập vào không hợp lệ!");
                     txtEmail.Focus();
                 }
                 else if (!Validations.IsFilled(txtCreditLine.Text))
                 {
                     dxErrorProvider1.SetError(txtCreditLine, "Bạn cần nhập vào Credit Line!");
                     txtCreditLine.Focus();
                 }
                 else if (!Validations.isNumeric(txtCreditLine.Text))
                 {
                     dxErrorProvider1.SetError(txtCreditLine, "Credit Line bạn nhập vào không hợp lệ!");
                     txtCreditLine.Focus();
                 }
                 else if (!Validations.IsFilled(txtDue.Text))
                 {
                     dxErrorProvider1.SetError(txtDue, "Bạn cần nhập vào Due!");
                     txtDue.Focus();
                 }
                 else if (!Validations.isNumeric(txtDue.Text))
                 {
                     dxErrorProvider1.SetError(txtDue, "Due bạn nhập vào không hợp lệ!");
                     txtDue.Focus();
                 }
                 else if (!Validations.IsFilled(txtGov.Text))
                 {
                     dxErrorProvider1.SetError(txtGov, "Bạn cần nhập vào GOV!");
                     txtGov.Focus();
                 }
                 else if(uluCity.EditValue == null){
                     dxErrorProvider1.SetError(uluCity, "Bạn cần chọn thành phố!");
                     uluCity.Focus();
                 }
                 else if (uluNhanVienHoTro.EditValue == null)
                 {
                     dxErrorProvider1.SetError(uluNhanVienHoTro, "Bạn cần chọn nhân viên trực tiếp hỗ trợ!");
                     uluNhanVienHoTro.Focus();
                 }
                 else
                 {
                     m_objCustomer = new ICustomer();
                     m_objCustomer.CustomerID = Guid.Parse(txtMaKH.Text);
                     m_objCustomer.CustomerName = txtTenDayDu.Text;
                     m_objCustomer.CompanyName = txtTenCongTy.Text;
                     m_objCustomer.Address = txtDiaChi.Text;
                     m_objCustomer.PhoneNo = txtDienThoai.Text;
                     m_objCustomer.Email = txtEmail.Text;
                     m_objCustomer.CreditLine = decimal.Parse(txtCreditLine.Text);
                     m_objCustomer.Due = int.Parse(txtDue.Text);
                     m_objCustomer.Gov = txtGov.Text;
                     m_objCustomer.CityID = "" + uluCity.Properties.GetKeyValueByDisplayText(uluCity.Text);
                     m_objCustomer.Employee_ID = Guid.Parse("" + uluNhanVienHoTro.Properties.GetKeyValueByDisplayText(uluNhanVienHoTro.Text));
                     m_objCustomer.IsActive = (chkIsActive.Checked) ? true : false;
                     m_objCustomer.IsDeleted = (chkIsDeleted.Checked) ? true : false;
                     m_objCustomer.Fax = (txtFax.Text == null) ? "" : txtFax.Text;
                     m_objCustomer.BankName = (txtTenNH.Text == null) ? "" : txtTenNH.Text;
                     m_objCustomer.BankAccount = (txtAccountBank.Text == null) ? "" : txtAccountBank.Text;
                     m_objCustomer.Note = (txtGhiChu.Text == null) ? "" : txtGhiChu.Text;                     
                     if(m_objCusController == null){
                         m_objCusController = new CustomerControllers(m_objConnection, m_objSecurity);
                     }
                     if(isFlag)
                         m_objCusController.ExecInsertAndUpdateCustomer(m_objCustomer, (short)0);  //Insert                         
                     else
                         m_objCusController.ExecInsertAndUpdateCustomer(m_objCustomer, (short)1);  //Update
                     popupControlContainer1.Visible = true;
                     lblKQ.Text = "Cập nhập thành công!!!";
                     timer1.Enabled = true;
                     popupControlContainer1.Show();                     
                 }                   
            }
             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message);
             }
             finally
             {
                 this.Cursor = Cursors.Default;
             }                                       
        }                

        private void LoadDataOfEmployee()
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;
                //1. Định nghĩa binding dữ liệu nguồn vào LookupEdit:
                if (m_objEmpController == null)
                    m_objEmpController = new EmployeeControllers(m_objConnection, m_objSecurity);
                DataTable objTable = m_objEmpController.getEmployee();
                uluNhanVienHoTro.Properties.DataSource = objTable;
                uluNhanVienHoTro.Properties.DisplayMember = "EmployeeName";
                uluNhanVienHoTro.Properties.ValueMember = "Employee_ID";
            }catch(Exception ex){
                MessageBox.Show(ex.Message);
            }
            finally
            {
                this.Cursor = Cursors.Default;         
            }                         
        }

        private void LoadDataOfCity()
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;
                //1. Định nghĩa binding dữ liệu nguồn vào LookupEdit:
                if (m_objCityController == null)
                    m_objCityController = new CityControllers(m_objConnection, m_objSecurity);
                DataTable objTable = m_objCityController.getCity();
                uluCity.Properties.DataSource = objTable;
                uluCity.Properties.DisplayMember = "CityName";
                uluCity.Properties.ValueMember = "CityID";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }

        private void BinddingDataOfControls(ICustomer objCustomer)
        {
             try
            {
                this.Cursor = Cursors.WaitCursor;
                if (objCustomer != null)
                {
                    txtMaKH.Text = "" + objCustomer.CustomerID;
                    txtTenDayDu.Text = "" + objCustomer.CustomerName;
                    txtTenCongTy.Text = "" + objCustomer.CompanyName;
                    txtDiaChi.Text = "" + objCustomer.Address;
                    txtDienThoai.Text = "" + objCustomer.PhoneNo;
                    txtEmail.Text = "" + objCustomer.Email;
                    if (!string.IsNullOrEmpty("" + objCustomer.CreditLine))
                        txtCreditLine.Text = "" + objCustomer.CreditLine;
                    if (!string.IsNullOrEmpty("" + objCustomer.Due))
                        txtDue.Text = "" + objCustomer.Due;
                    if (!string.IsNullOrEmpty(objCustomer.Gov))
                        txtGov.Text = "" + objCustomer.Gov;
                    if (objCustomer.IsActive == true)
                         chkIsActive.Checked = true;
                    if (objCustomer.IsDeleted == true)
                         chkIsDeleted.Checked = true;
                    if (!string.IsNullOrEmpty(objCustomer.Fax))
                        txtFax.Text = objCustomer.Fax;
                    if (!string.IsNullOrEmpty(objCustomer.BankAccount))
                        txtAccountBank.Text = objCustomer.BankAccount;
                    if (!string.IsNullOrEmpty(objCustomer.BankName))
                        txtTenNH.Text = objCustomer.BankName;
                    if (!string.IsNullOrEmpty(objCustomer.Note))
                        txtGhiChu.Text = objCustomer.Note;
                    uluCity.EditValue = Guid.Parse(""+objCustomer.CityID);
                    uluNhanVienHoTro.EditValue = objCustomer.Employee_ID;
                 }
            }
             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message);
             }
             finally
             {
                 this.Cursor = Cursors.Default;
             }            
        }

        private void frmCustomerDetails_KeyPress(object sender, KeyPressEventArgs e)
        {
            //if (e.KeyChar == (char)Keys.D1)
            //{
            //    this.ttCCusDetails.SelectedTabPage = this.ttPThongTinChinh;
            //}
            //else if (e.KeyChar == (char)Keys.D2)
            //{
            //    this.ttCCusDetails.SelectedTabPage = this.ttPThongTinPhu;
            //}
            //else if (e.KeyChar == (char)Keys.D3)
            //{
            //    this.ttCCusDetails.SelectedTabPage = this.ttPGhiChu;
            //}            
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.F1)
            {
                this.ttCCusDetails.SelectedTabPage = this.ttPThongTinChinh;
                return true;
            }
            else if (keyData == Keys.F2)
            {
                this.ttCCusDetails.SelectedTabPage = this.ttPThongTinPhu;
                return true;
            }
            else if (keyData == Keys.F3)
            {
                this.ttCCusDetails.SelectedTabPage = this.ttPGhiChu;
                return true;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

        private void frmCustomerDetails_KeyDown(object sender, KeyEventArgs e)
        {
            //if(e.KeyCode.ToString().Equals("F1"))
            //    this.ttCCusDetails.SelectedTabPage = this.ttPThongTinChinh;
            //else if (e.KeyCode.ToString().Equals("F2"))
            //    this.ttCCusDetails.SelectedTabPage = this.ttPThongTinPhu;
            //else if (e.KeyCode.ToString().Equals("F3"))
            //    this.ttCCusDetails.SelectedTabPage = this.ttPGhiChu;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (counterTick <= 5)
                counterTick++;
            else
            {
                counterTick = 0;
                ((System.Windows.Forms.Timer)sender).Enabled = false;
                ((System.Windows.Forms.Timer)sender).Stop();
                popupControlContainer1.Visible = false;
            }
        }
    }
}